import pygame
import os
from pathlib import Path

# 确保pygame混音器初始化
pygame.mixer.init()

class MusicPlayer:
    """音乐播放器类，用于在不同界面播放对应的背景音乐"""
    
    def __init__(self, root_dir=None):
        """
        初始化音乐播放器
        :param root_dir: 项目根目录，默认为当前文件所在目录的父目录
        """
        self.root_dir = root_dir or str(Path(__file__).resolve().parent.parent)
        self.current_music = None  # 当前播放的音乐路径
        self.volume = 0.5  # 默认音量
        pygame.mixer.music.set_volume(self.volume)
        
        # 音乐路径配置（可根据实际项目结构调整）
        self.music_paths = {
            "start": os.path.join(self.root_dir, "bgm/start_theme.mp3"),
            "battle": os.path.join(self.root_dir, "bgm/battle_theme.mp3"),
            "map": os.path.join(self.root_dir, "bgm/map_theme.mp3")
        }
        self.sound_paths = {
            "hit": os.path.join(self.root_dir, "sounds/hit.mp3"),  # 受击音效
        }
        
        # 加载音效到内存
        self.sounds = {}
        for sound_type, path in self.sound_paths.items():
            try:
                self.sounds[sound_type] = pygame.mixer.Sound(path)
                self.sounds[sound_type].set_volume(self.volume * 0.8)  # 音效音量稍低
            except pygame.error as e:
                print(f"【错误】无法加载音效 {path}: {e}")
                self.sounds[sound_type] = None

    def set_volume(self, value):
        """
        设置音量
        :param value: 音量值，范围0.0-1.0
        """
        if 0.0 <= value <= 1.0:
            self.volume = value
            pygame.mixer.music.set_volume(value)

    def play_music(self, music_type, loop=-1):
        """
        播放指定类型的背景音乐
        :param music_type: 音乐类型，对应music_paths中的键
        :param loop: 循环次数，-1表示无限循环
        """
        if music_type not in self.music_paths:
            print(f"【错误】未知的音乐类型: {music_type}")
            return
            
        music_path = self.music_paths[music_type]
        
        # 如果要播放的音乐和当前正在播放的相同，则不重复加载
        if self.current_music == music_path:
            return
            
        try:
            # 加载并播放音乐
            pygame.mixer.music.load(music_path)
            pygame.mixer.music.play(loop)
            self.current_music = music_path
            print(f"开始播放{music_type}音乐: {music_path}")
        except pygame.error as e:
            print(f"【错误】无法播放音乐 {music_path}: {e}")
            self.current_music = None

    def play_sound(self, sound_type):
        """
        播放指定类型的音效
        :param sound_type: 音效类型，对应sound_paths中的键
        """
        if sound_type in self.sounds and self.sounds[sound_type]:
            self.sounds[sound_type].play()
        else:
            print(f"【警告】未知或未加载的音效类型: {sound_type}")
            
    def stop_music(self):
        """停止当前播放的音乐"""
        if pygame.mixer.music.get_busy():
            pygame.mixer.music.stop()
            self.current_music = None
            print("音乐已停止")

    def pause_music(self):
        """暂停当前播放的音乐"""
        if pygame.mixer.music.get_busy():
            pygame.mixer.music.pause()
            print("音乐已暂停")

    def unpause_music(self):
        """恢复播放被暂停的音乐"""
        if not pygame.mixer.music.get_busy():
            pygame.mixer.music.unpause()
            print("音乐已恢复播放")

# 使用示例（在各个界面中引用）：
"""
# 在enter_ui.py中
from music_player import MusicPlayer

class EnterUI:
    def __init__(self):
        # 其他初始化代码...
        self.music_player = MusicPlayer()
        
    def run(self):
        # 开始界面运行时播放开始界面音乐
        self.music_player.play_music("start")
        # 其他代码...

"""